package Core

import spinal.core.{Area, Nameable}

/**
 * Created by PIC32F_USER on 03/03/2017.
 */
trait Plugin[T <: Pipeline] extends Nameable{
    var pipeline : T = null.asInstanceOf[T]
    setName(this.getClass.getSimpleName.replace("$",""))

    // Used to setup things with other plugins
    def setup(pipeline: T) : Unit = {}

    //Used to flush out the required hardware (called after setup)
    def build(pipeline: T) : Unit

    implicit class implicitsStage(stage: Stage){
        def plug[T <: Area](area : T) : T = {area.setCompositeName(stage,getName()).reflectNames();area}
    }
    implicit class implicitsPipeline(stage: Pipeline){
        def plug[T <: Area](area : T) = {area.setName(getName()).reflectNames();area}
    }
}
